package tests;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import org.apache.commons.net.ftp.FTPClient;
import org.junit.Test;

public class ServerTests {
	private final String FTP_SERVER = "localhost";
	private final int FTP_PORT = 1024;
	
	private final String FTPSERVER_ROOT = "/Users/jeromecha/Documents/";
	private final String REMOTE = "/Users/jeromecha/Documents/";
	private final String FILENAME = "test.txt";
	
	
	private final String USER_CORRECT = "toto";
	private final String PWD_CORRECT = "toto";
	private final String USER_INCORRECT = "tata";
	private final String PWD_INCORRECT = "titi";
	
	
	/************************************ Connexion ************************************/
	
//	@Test
//	/**
//	 * Test un utilisateur valide
//	 * @throws IOException
//	 */
//	public void goodFTPAuthentication() throws IOException {
//		FTPClient ftpClient = new FTPClient(); 								
//		ftpClient.connect(FTP_SERVER, FTP_PORT); 							
//		boolean login = ftpClient.login(USER_CORRECT, PWD_CORRECT);			
//		assertTrue("Erreur de login", login);
//		assertEquals("Le code de retour est incorrect",230, ftpClient.getReplyCode());
//		ftpClient.logout();
//		assertEquals("Le code de retour est incorrect",221, ftpClient.getReplyCode());
//	}
//	
//	@Test
//	/**
//	 * Test un mauvais utilisateur USER et PWD incorrect
//	 * @throws IOException
//	 */
//	public void badFTPAuthenticationUSERandPWD() throws IOException {
//		FTPClient ftpClient = new FTPClient();								
//		ftpClient.connect(FTP_SERVER, FTP_PORT);							
//		boolean login = ftpClient.login(USER_INCORRECT, PWD_INCORRECT); 
//		assertFalse("La connection ne devrait pas etre correct", login);							
//		ftpClient.disconnect();
//		assertEquals("Le code de retour est incorrect",503, ftpClient.getReplyCode());
//	}
//	
//	@Test
//	/**
//	 * Test un mauvais utilisateur USER incorrect, PWD correct
//	 * @throws IOException
//	 */
//	public void badFTPAuthenticationUSER() throws IOException {
//		FTPClient ftpClient = new FTPClient();								
//		ftpClient.connect(FTP_SERVER, FTP_PORT);
//		boolean login = ftpClient.login(USER_INCORRECT, PWD_CORRECT); 
//		assertFalse("La connection ne devrait pas etre correct", login);							
//		ftpClient.disconnect();
//		assertEquals("Le code de retour est incorrect",503, ftpClient.getReplyCode());
//	}
//	
//	@Test
//	/**
//	 * Test un mauvais utilisateur USER correct, PWD incorrect
//	 * @throws IOException
//	 */
//	public void badFTPAuthenticationPWD() throws IOException {
//		FTPClient ftpClient = new FTPClient();								
//		ftpClient.connect(FTP_SERVER, FTP_PORT);							
//		boolean login = ftpClient.login(USER_CORRECT, PWD_INCORRECT); 
//		assertFalse("La connection ne devrait pas etre correct", login);							
//		ftpClient.disconnect();
//		assertEquals("Le code de retour est incorrect",332, ftpClient.getReplyCode());
//	}
	
	/************************************ Lignes de commandes ************************************/
	
//	@Test
//	/**
//	 * Envoi d'une double commande "USER"
//	 * @throws IOException
//	 */
//	public void connectCommandeLine() throws IOException {
//		FTPClient ftpClient = new FTPClient();
//		ftpClient.connect(FTP_SERVER, FTP_PORT); 
//	
//		ftpClient.sendCommand("PASS toto");
//		assertEquals("Le code de retour est incorrect",503, ftpClient.getReplyCode());
//		
//		ftpClient.sendCommand("USER toto");
//		assertEquals("Le code de retour est incorrect",331, ftpClient.getReplyCode());
//		
//		ftpClient.sendCommand("USER toto");
//		assertEquals("Le code de retour est incorrect",331, ftpClient.getReplyCode());
//		
//		ftpClient.disconnect();
//		assertEquals("Le code de retour est incorrect",331, ftpClient.getReplyCode());
//	}
//	
//	@Test
//	/**
//	 * Envoi d'une double commande "USER"
//	 * @throws IOException
//	 */
//	public void connectCommandeLine2() throws IOException {
//		FTPClient ftpClient = new FTPClient();
//		ftpClient.connect(FTP_SERVER, FTP_PORT); 
//		
//		ftpClient.sendCommand("USER toto");
//		assertEquals("Le code de retour est incorrect",331, ftpClient.getReplyCode());
//		
//		ftpClient.sendCommand("USER toto");
//		assertEquals("Le code de retour est incorrect",331, ftpClient.getReplyCode());
//		
//		ftpClient.sendCommand("PASS toto");
//		assertEquals("Le code de retour est incorrect",230, ftpClient.getReplyCode());
//	}

	
//	@Test
//	/**
//	 * Envoi d'une commande "STOR" sans etre logger (NE MARCHE PAS)
//	 * @throws IOException
//	 */
//	public void connectCommandeSTORWithoutLogin() throws IOException {
//		FTPClient ftpClient = new FTPClient();
//		ftpClient.connect(FTP_SERVER, FTP_PORT); 
//		
//		ftpClient.sendCommand("STOR test.txt");
//		assertEquals("Le code de retour est incorrect",532, ftpClient.getReplyCode());
//	}
//	
//	@Test
//	/**
//	 * Envoi d'une commande "RETR" sans etre logger (NE MARCHE PAS)
//	 * @throws IOException
//	 */
//	public void connectCommandeRETRWithoutLogin() throws IOException {
//		FTPClient ftpClient = new FTPClient();
//		ftpClient.connect(FTP_SERVER, FTP_PORT); 
//		
//		ftpClient.sendCommand("RETR test.txt");
//		assertEquals("Le code de retour est incorrect",532, ftpClient.getReplyCode());
//	}
//	
//	@Test
//	/**
//	 * Envoi d'une commande "STOR" en etant logger
//	 * @throws IOException
//	 */
//	public void connectCommandeSTORLogin() throws IOException {
//		FTPClient ftpClient = new FTPClient();
//		ftpClient.connect(FTP_SERVER, FTP_PORT); 
//		boolean login = ftpClient.login(USER_CORRECT, PWD_CORRECT);
//		assertTrue("Erreur de login", login);
//		ftpClient.sendCommand("STOR test.txt");
//		assertEquals("Le code de retour est incorrect",226, ftpClient.getReplyCode());
//	}
//	
//	@Test
//	/**
//	 * Envoi d'une commande "RETR" en etant logger
//	 * @throws IOException
//	 */
//	public void connectCommandeRETRLogin() throws IOException {
//		FTPClient ftpClient = new FTPClient();
//		ftpClient.connect(FTP_SERVER, FTP_PORT); 
//		boolean login = ftpClient.login(USER_CORRECT, PWD_CORRECT);
//		assertTrue("Erreur de login", login);
//		ftpClient.sendCommand("RETR test.txt");
//		assertEquals("Le code de retour est incorrect",226, ftpClient.getReplyCode());
//	}
	
	/************************************ PROCESS ************************************/
	
//	@Test
//	/**
//	 * Liste l'ensemble du répertoire
//	 * @throws FtpException
//	 * @throws IOException
//	 * @throws NoSuchAlgorithmException
//	 */
//	public void listFTPFiles() throws IOException {
//		FTPClient ftpClient = new FTPClient();
//		ftpClient.connect(FTP_SERVER, FTP_PORT);
//		boolean login = ftpClient.login(USER_CORRECT, PWD_CORRECT);
//		assertTrue("Erreur de login", login);
//		String[] filenames = ftpClient.listNames(FTPSERVER_ROOT);
//		assertNotNull(filenames);
//		System.out.println("affichage du contenu");
//		for(int i =0; i<filenames.length; i++){
//			System.out.println(filenames[i]);
//		}
//		ftpClient.logout();
//	}
	
//	@Test
//	/**
//	 * Test l'envoi d'un fichier
//	 * @throws FtpException
//	 * @throws IOException
//	 */
//	public void sendFTPFile() throws IOException {
//		FTPClient ftpClient = new FTPClient();
//		ftpClient.connect(FTP_SERVER, FTP_PORT);
//		boolean login = ftpClient.login(USER_CORRECT, PWD_CORRECT);
//		assertTrue("Erreur de login", login);
//		boolean isSent = ftpClient.storeFile(REMOTE, new FileInputStream(new File("/Users/jeromecha/Downloads/"+FILENAME)));
//		assertEquals("Le code de retour est incorrect",226, ftpClient.getReplyCode());
//		assertTrue("Fichier non envoyer", isSent);
//		ftpClient.logout();
//	}
	
//	@Test
//	/**
//	 * Test la réception d'un fichier
//	 * @throws FtpException
//	 * @throws IOException
//	 */
//	public void receiveFTPFile() throws IOException {
//		FTPClient ftpClient = new FTPClient();
//		ftpClient.connect(FTP_SERVER, FTP_PORT);
//		boolean login = ftpClient.login(USER_CORRECT, PWD_CORRECT);
//		assertTrue("Erreur de login", login);
//		boolean isReceived = ftpClient.retrieveFile(REMOTE + "test_" +FILENAME, new FileOutputStream(new File("/Users/jeromecha/Documents/"+FILENAME)));
//		assertTrue("Fichier non reçu", isReceived);
//		ftpClient.logout();
//	}
	
//	@Test
//	/**
//	 * Test la réception d'un fichier
//	 * @throws FtpException
//	 * @throws IOException
//	 */
//	public void commandPWD() throws IOException {
//		FTPClient ftpClient = new FTPClient();
//		ftpClient.connect(FTP_SERVER, FTP_PORT);
//		boolean login = ftpClient.login(USER_CORRECT, PWD_CORRECT);
//		assertTrue("Erreur de login", login);
//		assertEquals("Le code de retour est incorrect",257,ftpClient.pwd());
//	}

}